<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        // 组合函数：
        // lodash中的组合函数：flow()从左到右  flowRight()从右到左 

        // 模拟lodash中的组合函数flowRight
        // const _ = require('lodash');
        // const reverse = arr => arr.reverse();//数组反转
        // const first = arr=> arr[0];//数组第一个元素
        // const toUpper = s=> s.toUpperCase();//转大写
        // const f = compose(toUpper,fisrt,reverse)
        // console.log(f(['one','two','three']));//THREE

        // 组合函数原理模拟
        // 数组方法reduce()：让数组中的每个元素去执行一个由开发者提供的函数，并将所有元素执行的结果汇总成一个总的结果
        function compose (arr) {
            return function () {
                return arr.reverse().reduce(function (item ,fn) {
                    return fn(item);
                },value)
            }
        }

        // const compose = (arr) => value => arr.reverse().reduce((item,fn) => fn(item,value))
        
        const f = compose(toUpper,first,reverse);
        console.log(f(['a','b','c']));

        // 函数组合的特点：
        // 函数组合要满足结合律：比如组合三个函数f,g,h,无论哪两个函数先组合，要结果都一致。
        let f = compose(f,g,h);
        let a = compose(compose(f,g),h)  == compose(f,compose(g,h));//true

        // 函数组合的调试
        

    </script>
</body>
</html>